Projekt zaliczeniowy
Streszczenie
Celem niniejszego raportu jest analiza czynników wpływających na pojemność superkondensatorów oraz budowa modelu predykcyjnego. Zbiór danych wejściowych, liczący ponad 900 wierszy, poddano procesowi czyszczenia i transformacji. Wykonano w tym celu kodowanie zmiennych kategorialnych (Label Encoding) oraz uzupełnienie brakujących wartości. Przeprowadzono eksploracyjną analizę danych badając rozkłady i macierze korelacji. Na etapie modelowania wykorzystano algorytm drzew decyzyjnych do przewidywania pojemności. Raport kończy się oceną skuteczności modelu.
Wstęp
Wylistowanie użytych bibliotek oraz ustawienie seeda dla powtarzalności wyników.
Wczytywanie danych
## Ref. Limits.of.Potential.Window..V.
## 1 DOI: 10.1039/c7ta03093b 0 to 0.8
## 2 DOI: 10.1039/c6ta10933k 0 to 1
## 3 DOI: 10.1039/c6ta10933k 0 to 1
## 4 DOI: 10.1039/c6ta10933k 0 to 1
## 5 DOI: 10.1039/c6ta10933k 0 to 1
## 6 DOI: 10.1039/d1se01134k 0 to 0.5
## Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
## 1 0 0.8
## 2 0 1.0
## 3 0 1.0
## 4 0 1.0
## 5 0 1.0
## 6 0 0.5
## Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
## 1 0.8 1 680
## 2 1.0 1 367
## 3 1.0 2 338
## 4 1.0 5 283
## 5 1.0 10 246
## 6 0.5 1 872
## Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
## 1 186.3 NA
## 2 537.0 6.1
## 3 537.0 6.1
## 4 537.0 6.1
## 5 537.0 6.1
## 6 168.2 NA
## Equivalent.Series.Resistance..Rs...ohm. Electrode.Configuration
## 1 7.70 CNF/RGO/moOxNy
## 2 1.95 sulfur-doped graphene foam (SGF)
## 3 1.95 sulfur-doped graphene foam (SGF)
## 4 1.95 sulfur-doped graphene foam (SGF)
## 5 1.95 sulfur-doped graphene foam (SGF)
## 6 0.80 moS2-moO2/G
## Pore.Size..nm. Pore.Volume..cm.3.g. Ratio.of.ID.IG N.at. C.at. O.at.
## 1 NA NA 1.45 2.1 NA NA
## 2 NA NA 1.28 0.0 85.6 9.1
## 3 NA NA 1.28 0.0 85.6 9.1
## 4 NA NA 1.28 0.0 85.6 9.1
## 5 NA NA 1.28 0.0 85.6 9.1
## 6 NA NA 1.22 NA NA NA
## Electrolyte.Chemical.Formula Electrolyte.Ionic.Conductivity
## 1 H2SO4 7
## 2 KOH 6
## 3 KOH 6
## 4 KOH 6
## 5 KOH 6
## 6 KOH 6
## Electrolyte.Concentration..M. Cell.Configuration..three.two.electrode.system.
## 1 1 three-electrode system
## 2 6 two-electrode system
## 3 6 two-electrode system
## 4 6 two-electrode system
## 5 6 two-electrode system
## 6 2 three-electrode system
## Ref. Limits.of.Potential.Window..V.
## Length:925 Length:925
## Class :character Class :character
## Mode :character Mode :character
##
##
##
##
## Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
## Min. :-1.1000 Min. :-0.2000
## 1st Qu.:-0.3000 1st Qu.: 0.4000
## Median : 0.0000 Median : 0.6000
## Mean :-0.2343 Mean : 0.6301
## 3rd Qu.: 0.0000 3rd Qu.: 0.8000
## Max. : 0.2000 Max. : 3.5000
## NA's :4 NA's :4
## Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
## Min. :0.4000 Min. : 0.050 Min. : 1.4
## 1st Qu.:0.6000 1st Qu.: 1.000 1st Qu.: 148.6
## Median :0.8250 Median : 2.000 Median : 260.2
## Mean :0.8634 Mean : 5.857 Mean : 415.5
## 3rd Qu.:1.0000 3rd Qu.: 5.000 3rd Qu.: 509.9
## Max. :3.5000 Max. :200.000 Max. :3344.1
## NA's :5 NA's :16 NA's :17
## Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
## Min. : 8.896 Min. : 0.080
## 1st Qu.: 57.000 1st Qu.: 0.670
## Median : 159.970 Median : 1.540
## Mean : 417.438 Mean : 3.048
## 3rd Qu.: 546.000 3rd Qu.: 3.240
## Max. :2400.000 Max. :24.200
## NA's :572 NA's :786
## Equivalent.Series.Resistance..Rs...ohm. Electrode.Configuration
## Min. : 0.200 Length:925
## 1st Qu.: 0.350 Class :character
## Median : 0.580 Mode :character
## Mean : 1.602
## 3rd Qu.: 2.000
## Max. :17.500
## NA's :772
## Pore.Size..nm. Pore.Volume..cm.3.g. Ratio.of.ID.IG N.at.
## Min. : 0.530 Min. :0.0200 Min. :0.120 Min. : 0.00
## 1st Qu.: 3.045 1st Qu.:0.1680 1st Qu.:0.940 1st Qu.: 0.00
## Median : 4.337 Median :0.2170 Median :1.050 Median : 0.00
## Mean : 8.618 Mean :0.4857 Mean :1.121 Mean : 2.50
## 3rd Qu.:13.625 3rd Qu.:0.5075 3rd Qu.:1.170 3rd Qu.: 3.20
## Max. :44.131 Max. :2.3500 Max. :2.900 Max. :23.82
## NA's :769 NA's :729 NA's :596 NA's :690
## C.at. O.at. Electrolyte.Chemical.Formula
## Min. : 1.40 Min. : 1.900 Length:925
## 1st Qu.:37.32 1st Qu.: 8.883 Class :character
## Median :81.00 Median :13.700 Mode :character
## Mean :66.52 Mean :19.176
## 3rd Qu.:85.58 3rd Qu.:27.098
## Max. :98.10 Max. :54.280
## NA's :699 NA's :703
## Electrolyte.Ionic.Conductivity Electrolyte.Concentration..M.
## Min. :1.000 Min. :0.100
## 1st Qu.:6.000 1st Qu.:1.000
## Median :6.000 Median :1.000
## Mean :5.806 Mean :2.576
## 3rd Qu.:7.000 3rd Qu.:6.000
## Max. :8.000 Max. :6.000
## NA's :99 NA's :62
## Cell.Configuration..three.two.electrode.system.
## Length:925
## Class :character
## Mode :character
##
##
##
##
Jak można zauważyć dane nie są wyczyszczone. W wielu kolumnach występują wartości puste (NA). Zostaną one usunięte w kolejnym kroku.
Przygotowanie zbioru danych do analizy
Usunięcie kolumn, które nie niosą informacji
## 'data.frame': 925 obs. of 19 variables:
## $ Lower.Limit.of.Potential.Window..V. : num 0 0 0 0 0 0 -0.4 -0.4 -0.4 -0.4 ...
## $ Upper.Limit.of.Potential.Window..V. : num 0.8 1 1 1 1 0.5 0.2 0.2 0.2 0.2 ...
## $ Potential.Window..V. : num 0.8 1 1 1 1 0.5 0.6 0.6 0.6 0.6 ...
## $ Current.Density..A.g. : num 1 1 2 5 10 1 1 1 1 1 ...
## $ Capacitance..F.g. : num 680 367 338 283 246 872 143 306 360 483 ...
## $ Specific.Surface.Area..m.2.g. : num 186 537 537 537 537 ...
## $ Charge.Transfer.Resistance..Rct...ohm. : num NA 6.1 6.1 6.1 6.1 NA NA NA NA NA ...
## $ Equivalent.Series.Resistance..Rs...ohm. : num 7.7 1.95 1.95 1.95 1.95 0.8 NA NA NA NA ...
## $ Electrode.Configuration : chr "CNF/RGO/moOxNy" "sulfur-doped graphene foam (SGF)" "sulfur-doped graphene foam (SGF)" "sulfur-doped graphene foam (SGF)" ...
## $ Pore.Size..nm. : num NA NA NA NA NA NA NA NA NA NA ...
## $ Pore.Volume..cm.3.g. : num NA NA NA NA NA NA NA NA NA NA ...
## $ Ratio.of.ID.IG : num 1.45 1.28 1.28 1.28 1.28 ...
## $ N.at. : num 2.1 0 0 0 0 NA NA NA NA NA ...
## $ C.at. : num NA 85.6 85.6 85.6 85.6 NA NA NA NA NA ...
## $ O.at. : num NA 9.1 9.1 9.1 9.1 NA NA NA NA NA ...
## $ Electrolyte.Chemical.Formula : chr " H2SO4" "KOH" "KOH" "KOH" ...
## $ Electrolyte.Ionic.Conductivity : int 7 6 6 6 6 6 NA NA NA NA ...
## $ Electrolyte.Concentration..M. : num 1 6 6 6 6 2 NA NA NA NA ...
## $ Cell.Configuration..three.two.electrode.system.: chr "three-electrode system" "two-electrode system" "two-electrode system" "two-electrode system" ...
Kolumna z identyfikatorem publikacji została usunięta, ponieważ nie wniesie nic do analizy. Kolumna z oknem potencjału jest tak naprawdę duplikatem kolumn z początkiem i końcem tego zakresu, więc również została usunięta.
Kolumny z ciągami znaków
## Electrode.Configuration Electrolyte.Chemical.Formula
## 1 353 27
## Cell.Configuration..three.two.electrode.system.
## 1 3
useful_col_data <- useful_col_data %>%
select(-Electrode.Configuration, -Electrolyte.Chemical.Formula)
ggplot(data = useful_col_data, aes(x = Cell.Configuration..three.two.electrode.system., fill = Cell.Configuration..three.two.electrode.system.)) +
geom_bar(alpha = 0.8) +
scale_fill_futurama(labels = c("Brak informacji", "three-electrode system", "two-electrode system")) +
theme_minimal() +
labs(title = "Liczebność poszczególnych konfiguracji elektrod",
y = "Liczba wystąpień",
x = "",
fill = "System elektrod") +
theme(axis.text.x = element_blank())numeric_col_data <- useful_col_data %>%
mutate(Cell.Configuration..three.two.electrode.system. = case_when(
Cell.Configuration..three.two.electrode.system. == "" ~ 0,
Cell.Configuration..three.two.electrode.system. == "three-electrode system" ~ 1,
Cell.Configuration..three.two.electrode.system. == "two-electrode system" ~ 2
))Dwie kolumny z ciągami znaków zostały usunięte z powodu wystepowania zbyt wielu kategorii, co mogłoby rozmyć informację. Ostatnia z kolumn przechowująca informację o konfiguracji ogniwa została przekonwertowana na liczbową za pomocą podejścia Label Encoding zgodnie z poniższą tabelą:
| Oryginalna wartość | Label Encoding |
|---|---|
"" (pusty) |
0 |
three-electrode system |
1 |
two-electrode system |
2 |
Zastąpienie wartości pustych zerami
Sprawdzenie, czy nie ma wartości pustych
## Lower.Limit.of.Potential.Window..V.
## 0
## Upper.Limit.of.Potential.Window..V.
## 0
## Potential.Window..V.
## 0
## Current.Density..A.g.
## 0
## Capacitance..F.g.
## 0
## Specific.Surface.Area..m.2.g.
## 0
## Charge.Transfer.Resistance..Rct...ohm.
## 0
## Equivalent.Series.Resistance..Rs...ohm.
## 0
## Pore.Size..nm.
## 0
## Pore.Volume..cm.3.g.
## 0
## Ratio.of.ID.IG
## 0
## N.at.
## 0
## C.at.
## 0
## O.at.
## 0
## Electrolyte.Ionic.Conductivity
## 0
## Electrolyte.Concentration..M.
## 0
## Cell.Configuration..three.two.electrode.system.
## 0
Wszystkie wartości puste zostały zastąpione zerami, aby umożliwić dalszą analizę. Uznano, że ich nie podano, więc są traktowane jako zera. Należy jednak zauważyć, że w wielu kolumnach wartości NA stanowiły większość co świadczy o tym, że zbiór danych nie został należycie przygotowany.
Podstawowe statystyki
Rozmiar danych oraz statystyki
## [1] 925
## [1] 17
## 'data.frame': 925 obs. of 17 variables:
## $ Lower.Limit.of.Potential.Window..V. : num 0 0 0 0 0 0 -0.4 -0.4 -0.4 -0.4 ...
## $ Upper.Limit.of.Potential.Window..V. : num 0.8 1 1 1 1 0.5 0.2 0.2 0.2 0.2 ...
## $ Potential.Window..V. : num 0.8 1 1 1 1 0.5 0.6 0.6 0.6 0.6 ...
## $ Current.Density..A.g. : num 1 1 2 5 10 1 1 1 1 1 ...
## $ Capacitance..F.g. : num 680 367 338 283 246 872 143 306 360 483 ...
## $ Specific.Surface.Area..m.2.g. : num 186 537 537 537 537 ...
## $ Charge.Transfer.Resistance..Rct...ohm. : num 0 6.1 6.1 6.1 6.1 0 0 0 0 0 ...
## $ Equivalent.Series.Resistance..Rs...ohm. : num 7.7 1.95 1.95 1.95 1.95 0.8 0 0 0 0 ...
## $ Pore.Size..nm. : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Pore.Volume..cm.3.g. : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Ratio.of.ID.IG : num 1.45 1.28 1.28 1.28 1.28 ...
## $ N.at. : num 2.1 0 0 0 0 0 0 0 0 0 ...
## $ C.at. : num 0 85.6 85.6 85.6 85.6 0 0 0 0 0 ...
## $ O.at. : num 0 9.1 9.1 9.1 9.1 0 0 0 0 0 ...
## $ Electrolyte.Ionic.Conductivity : num 7 6 6 6 6 6 0 0 0 0 ...
## $ Electrolyte.Concentration..M. : num 1 6 6 6 6 2 0 0 0 0 ...
## $ Cell.Configuration..three.two.electrode.system.: num 1 2 2 2 2 1 2 2 2 2 ...
## Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
## Min. :-1.1000 Min. :-0.2000
## 1st Qu.:-0.3000 1st Qu.: 0.4000
## Median : 0.0000 Median : 0.6000
## Mean :-0.2333 Mean : 0.6274
## 3rd Qu.: 0.0000 3rd Qu.: 0.8000
## Max. : 0.2000 Max. : 3.5000
## Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
## Min. :0.0000 Min. : 0.000 Min. : 0.0
## 1st Qu.:0.6000 1st Qu.: 1.000 1st Qu.: 143.5
## Median :0.8000 Median : 2.000 Median : 255.0
## Mean :0.8587 Mean : 5.756 Mean : 407.9
## 3rd Qu.:1.0000 3rd Qu.: 5.000 3rd Qu.: 493.6
## Max. :3.5000 Max. :200.000 Max. :3344.1
## Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
## Min. : 0.00 Min. : 0.0000
## 1st Qu.: 0.00 1st Qu.: 0.0000
## Median : 0.00 Median : 0.0000
## Mean : 159.30 Mean : 0.4581
## 3rd Qu.: 83.11 3rd Qu.: 0.0000
## Max. :2400.00 Max. :24.2000
## Equivalent.Series.Resistance..Rs...ohm. Pore.Size..nm. Pore.Volume..cm.3.g.
## Min. : 0.0000 Min. : 0.000 Min. :0.0000
## 1st Qu.: 0.0000 1st Qu.: 0.000 1st Qu.:0.0000
## Median : 0.0000 Median : 0.000 Median :0.0000
## Mean : 0.2649 Mean : 1.453 Mean :0.1029
## 3rd Qu.: 0.0000 3rd Qu.: 0.000 3rd Qu.:0.0000
## Max. :17.5000 Max. :44.131 Max. :2.3500
## Ratio.of.ID.IG N.at. C.at. O.at.
## Min. :0.0000 Min. : 0.000 Min. : 0.00 Min. : 0.000
## 1st Qu.:0.0000 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 0.000
## Median :0.0000 Median : 0.000 Median : 0.00 Median : 0.000
## Mean :0.3986 Mean : 0.635 Mean :16.25 Mean : 4.602
## 3rd Qu.:1.0000 3rd Qu.: 0.000 3rd Qu.: 0.00 3rd Qu.: 0.000
## Max. :2.9000 Max. :23.820 Max. :98.10 Max. :54.280
## Electrolyte.Ionic.Conductivity Electrolyte.Concentration..M.
## Min. :0.000 Min. :0.000
## 1st Qu.:5.000 1st Qu.:1.000
## Median :6.000 Median :1.000
## Mean :5.185 Mean :2.403
## 3rd Qu.:7.000 3rd Qu.:6.000
## Max. :8.000 Max. :6.000
## Cell.Configuration..three.two.electrode.system.
## Min. :0.000
## 1st Qu.:1.000
## Median :1.000
## Mean :1.181
## 3rd Qu.:1.000
## Max. :2.000
Analiza wartości atrybutów
for (c in colnames(cleaned_data)) {
if (is.numeric(cleaned_data[[c]]) && c != "Cell.Configuration..three.two.electrode.system.") {
plot <- ggplot(cleaned_data, aes(x = .data[[c]])) +
geom_density(fill = "lightblue", alpha = 0.7) +
ggtitle(paste("Wykres gęstości rozkładu wartości dla:", c))
print(plot)
}
}Dla każdej kolumny numerycznej został przedstawiony wykres gęstości rozkładu wartości. Wykresy gęstościowe niosą więcej informacji, ponieważ pokazują, w jakim przedziale skupia się większość wartości. Można zauważyć, że w wielu kolumnach pojawiło się wiele zer po wyczyszczeniu wartości NA.
Korelacja
numeric_cols <- cleaned_data %>%
select(where(is.numeric))
corr_matrix <- cor(numeric_cols, use = "pairwise.complete.obs")
ggcorrplot(corr_matrix,
method = "square",
type = "lower",
lab = TRUE,
lab_size = 5)plot <- ggplot(cleaned_data, aes(x = Lower.Limit.of.Potential.Window..V., y = Upper.Limit.of.Potential.Window..V.)) +
geom_point(color = "lightgreen", alpha = 0.7, size = 2) +
scale_color_tron() +
theme_minimal() +
labs(title = "Relacja granic zakresu okna potencjału",
x = "Lower.Limit.of.Potential.Window..V.",
y = "Upper.Limit.of.Potential.Window..V.")
ggplotly(plot)Najwyższą korelację odnotowano pomiędzy dolnym a górnym limitem okna potencjałowego. Powyższy interaktywny wykres ilustruje, że wraz ze wzrostem dolnej granicy zakresu rośnie też górna.
Korelacja jest również wysoka pomiędzy wielkością przedziału, a górną granicą zakresu stabilności. Jest to korelacja, której można było się spodziewać. Jeśli granice przedziału się przesuwają, to cały przedział również się zwiększa.
Wysoka zależność na poziomie około 0.6 występuje także między Charge Transfer Resistance (Rct), czyli oporem transferu ładunku pomiędzy elektrodą a elektrolitem, a Equivalent Series Resistance (Rs), czyli całkowitym oporem wewnętrznym superkondensatora. Może to wynikać z tego, że opór między elektrodą a elektrolitem jest składową całkowitego oporu.
Niższą, lecz zauważalną korelację w granicach wartości 0.4 można zaobserwować pomiędzy powierzchnią właściwą, a całkowitą objętością porów oraz wielkością okna potencjału. Wskazuje to, że struktura materiału ma znaczenie i wpływa na okno potencjału, jednak korelacja nie jest na tyle wysoka, aby twierdzić że jest to jedyny czynnik, który na to wpływa.
plot <- ggplot(cleaned_data, aes(x = C.at., y = O.at.)) +
geom_point(color = "steelblue", alpha = 0.7, size = 2) +
theme_minimal() +
labs(title = "Relacja węgiel vs tlen",
x = "Stężenie węgla (% at.)",
y = "Stężenie tlenu (% at.)")
ggplotly(plot)Niska wartość korelacji występuje także pomiędzy procentami atomów węgla, azotu i tlenu. Przykładowo jak widać na powyższym wykresie, występuje zależność im więcej atomów węgla, tym mniej tlenu.
Ciekawą obserwacją jest także korelacja pomiędzy procentem atomów węgla a wielkością okna, w którym materiał pozostaje stabilny. Wynosi ona 0.33, a dla atomów tlenu i azotu jest równa bądź bliska zeru. Sugeruje to, że występowanie atomów węgla może mieć jakiś wpływ na potencjał superkondensatora.
Uczenie maszynowe
Predykcja za pomocą drzewa decyzyjnego
data_for_model <- cleaned_data
train_index <- createDataPartition(data_for_model$Capacitance..F.g., p = 0.7, list = FALSE)
train_set <- data_for_model[train_index, ]
test_set <- data_for_model[-train_index, ]
ctrl <- trainControl(method = "cv", number = 10)
tree_model_caret <- train(Capacitance..F.g. ~ .,
data = train_set,
method = "rpart",
trControl = ctrl,
tuneLength = 10)
predictions <- predict(tree_model_caret, test_set)Wyniki
plot_data <- data.frame(
Observed = test_set$Capacitance..F.g.,
Predicted = predictions
)
plot <- ggplot(plot_data, aes(x = Observed, y = Predicted)) +
geom_point(color = "blue", alpha = 0.6) +
labs(title = "Wartości rzeczywiste vs przewidywane",
x = "Rzeczywista pojemność",
y = "Przewidywana pojemność") +
theme_minimal()
ggplotly(plot)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 142.9 255.5 419.3 493.5 3111.5
## RMSE Rsquared MAE
## 338.7790609 0.4833006 207.4666178
mean_capacitance <- mean(test_set$Capacitance..F.g., na.rm = TRUE)
# MAE = 207.5
error_percentage <- (207.5 / mean_capacitance) * 100
error_percentage## [1] 49.48323